<?php
/**
 * @author Mr.UBKey
 * @package XPHP
 * @version Beta
 * @copyright XWEB
 */
class XPHP_Html_Validation
{
	/**
	 * Mảng chứa các thông báo lỗi
	 * @var array
	 */
	public $messages = array();
	
	/**
	 * Mảng chứa các quy tắc bắt lỗi
	 * @var array
	 */
	public $rules = array();
	
	/**
	 * Tên form cần valid
	 * @var string
	 */
	private $formName;
	
	public function __construct($model)
	{
		require_once 'XPHP/Reflection.php';
		require_once 'XPHP/Model.php';
		require_once 'XPHP/Model/Validation.php';
		
		//Lấy toàn bộ danh sách các thuộc tính của Model
		$ref_model = new XPHP_Reflection("XPHP_Model");
		$properties_model = array();
		foreach ($ref_model->getProperties() as $property)
		{
			$properties_model[] = $property->getName();
		}
		//Lấy danh sách các property của lớp thừa kế XPHP_Model
		$ref = new XPHP_Reflection($model);
		foreach ($ref->getProperties() as $property)
		{
			$property_name = $property->getName();
			if(!in_array($property_name, $properties_model))
			{	
				$property_attribute = XPHP_Attribute::PropertyAttributes($model, $property->getName())->attributes;
				//Nếu có attribute validation
				if(isset($property_attribute["validate"]))
				{
					$property_validate = $property_attribute["validate"]->attributes;
					foreach ($property_validate as $valid => $value)
						$this->$valid($property_name, $value);
				}
			}
		}
	}
	
	/**
	 * Phương thức kiểm tra tính bắt buộc
	 * @param string $validate Chuỗi kiểm tra và thông báo lỗi
	 * @param string $value Giá trị cần kiểm tra
	 */
	public function required($propertyName, $validate)
	{
		$arrValid = explode(",", $validate);
		if(trim($arrValid[0]) == "true")
		{
			$this->rules[$propertyName]['required'] = true;
			
			if(isset($arrValid[1]))
				$this->messages[$propertyName]['required'] = trim($arrValid[1]); 
			else
				$this->messages[$propertyName]['required'] = "This field is required";
		}
	}

	/**
	 * Phương thức kiểm tra độ dài tối thiểu của chuỗi
	 * @param string $validate Chuỗi kiểm tra và thông báo lỗi
	 * @param string $value Giá trị cần kiểm tra
	 */
	public function minlength($propertyName, $validate)
	{
		$arrValid = explode(",", $validate);
		$minlength = (int)$arrValid[0];
		
		$this->rules[$propertyName]['minlength'] = $minlength;
		
		if(isset($arrValid[1]))
			$this->messages[$propertyName]['minlength'] = trim($arrValid[1]); 
		else
			$this->messages[$propertyName]['minlength'] = "This field minlength " . $arrValid[0];
	}

	/**
	 * Phương thức kiểm tra độ dài tối đa
	 * @param string $validate Chuỗi kiểm tra và thông báo lỗi
	 * @param string $value Giá trị cần kiểm tra
	 */
	public function maxlength($propertyName, $validate)
	{
		$arrValid = explode(",", $validate);
		$maxlength = (int)$arrValid[0];
		
		$this->rules[$propertyName]['maxlength'] = $maxlength;
		
		if(isset($arrValid[1]))
			$this->messages[$propertyName]['maxlength'] = trim($arrValid[1]); 
		else
			$this->messages[$propertyName]['maxlength'] = "This field maxlength " . $arrValid[0];
				
	}
	
	/**
	 * Phương thức kiểm tra khoảng độ dài
	 * @param string $validate Chuỗi kiểm tra và thông báo lỗi
	 * @param string $value Giá trị cần kiểm tra
	 */
	public function rangelength($propertyName, $validate)
	{
		$arrValid = explode(",", $validate);
		$range = explode("-", $arrValid[0]);
		$minlength = (int)$range[0];
		$maxlength = (int)$range[1];

		$this->rules[$propertyName]['rangelength'] = array($minlength, $maxlength);
		
		if(isset($arrValid[1]))
			$this->messages[$propertyName]['rangelength'] = trim($arrValid[1]); 
		else
			$this->messages[$propertyName]['rangelength'] = "This field minlength $minlength maxlength $maxlength";
	}
	
	/**
	 * Phương thức kiểm tra giá trị nhỏ nhất
	 * @param string $validate Chuỗi kiểm tra và thông báo lỗi
	 * @param string $value Giá trị cần kiểm tra
	 */
	public function min($propertyName, $validate)
	{
		$arrValid = explode(",", $validate);
		$min = (int)$arrValid[0];

		$this->rules[$propertyName]['min'] = $min;
		
		if(isset($arrValid[1]))
			$this->messages[$propertyName]['min'] = trim($arrValid[1]); 
		else
			$this->messages[$propertyName]['min'] = "This field min $min";

	}
	
	/**
	 * Phương thức kiểm tra giá trị lớn nhất
	 * @param string $validate Chuỗi kiểm tra và thông báo lỗi
	 * @param string $value Giá trị cần kiểm tra
	 */
	public function max($propertyName, $validate)
	{
		$arrValid = explode(",", $validate);
		$max = (int)$arrValid[0];

		$this->rules[$propertyName]['max'] = $max;
		
		if(isset($arrValid[1]))
			$this->messages[$propertyName]['max'] = trim($arrValid[1]); 
		else
			$this->messages[$propertyName]['max'] = "This field max $max";

	}
	
	/**
	 * Phương thức kiểm tra giá trị lớn nhất và nhỏ nhất
	 * @param string $validate Chuỗi kiểm tra và thông báo lỗi
	 * @param string $value Giá trị cần kiểm tra
	 */
	public function range($propertyName, $validate)
	{
		$arrValid = explode(",", $validate);
		$range = explode("-", $arrValid[0]);
		$min = (int)$range[0];
		$max = (int)$range[1];
		
		$this->rules[$propertyName]['range'] = array($min, $max);
		
		if(isset($arrValid[1]))
			$this->messages[$propertyName]['range'] = trim($arrValid[1]); 
		else
			$this->messages[$propertyName]['range'] = "This field min $min max $max";
	}
	
	/**
	 * Phương thức kiểm tra tính chính xác của email
	 * @param string $validate Chuỗi kiểm tra và thông báo lỗi
	 * @param string $value Giá trị cần kiểm tra
	 */
	public function email($propertyName, $validate)
	{
		$arrValid = explode(",", $validate);
		if(trim($arrValid[0]) == "true")
		{
			$this->rules[$propertyName]['email'] = true;
		
			if(isset($arrValid[1]))
				$this->messages[$propertyName]['email'] = trim($arrValid[1]); 
			else
				$this->messages[$propertyName]['email'] = "Email is invalid";
		}
	}
	
	/**
	 * Phương thức kiểm tra tính chính xác của URL
	 * @param string $validate Chuỗi kiểm tra và thông báo lỗi
	 * @param string $value Giá trị cần kiểm tra
	 */
	public function url($propertyName, $validate)
	{
		$arrValid = explode(",", $validate);
		if(trim($arrValid[0]) == "true")
		{
			$this->rules[$propertyName]['url'] = true;
			if(isset($arrValid[1]))
				$this->messages[$propertyName]['url'] = trim($arrValid[1]); 
			else
				$this->messages[$propertyName]['url'] = "Url is invalid";
		}
	}
	
	public function date()
	{}
	
	public function dateISO()
	{}
	
	public function dateDE()
	{}
	
	public function number()
	{}
	
	public function numberDE()
	{}
	
	public function digits()
	{}
	
	public function creditcard()
	{}
	
	public function accept()
	{}
	
	public function equalTo()
	{}
	
	public function getScript()
	{
		$jsonRules = json_encode($this->rules);
		$jsonMessages = json_encode($this->messages);
		$script = "<script type='text/javascript'>";
		$script .= "$(document).ready(function(){ $('form";
		if(!empty($this->formName))
			$script .= "#".$this->formName;
		$script .= "').validate({rules: $jsonRules, messages: $jsonMessages}) });";
		$script .= "</script>";
		
		return $script;
	}
	
	public function setFormName($formName)
	{
		$this->formName = $formName;
	}
}